package com.nexgo.payment.databases;

import com.nexgo.payment.constrant.ValueKey;

import java.util.List;

/**
 * Created by xiaox on 2017/1/17.
 */

public interface DataSource {
    /**
     * 保存数据到map内存表
     *
     * @param key   键值
     * @param value 数据
     */
    void setValue(ValueKey key, Object value);

    /**
     * 获取map内存表数据
     *
     * @param key 键值
     * @return 数据
     */
    Object getValue(ValueKey key);

    /**
     * 获取终端密码信息
     *
     * @return
     */
    PasswordInfo getPasswordInfo();

    /**
     * 设置终端密码信息
     *
     * @param info
     */
    void setPasswordInfo(PasswordInfo info);

    /**
     * 获取交易记录数目
     *
     * @return
     */
    long getSuccessfulTransRecordNum();

    /**
     * 获取未撤销交易记录数目
     *
     * @return
     */
    long getSuccessfulTransRecordNotVoidNum();
    /**
     * 获取冲正
     *
     * @return
     */
    long getReversalTransRecordNum();
    /**
     * 根据键名获取对应的键值
     *
     * @param preferencesId 键名
     * @return 返回键值
     */
    String getParamValue(String preferencesId);

    /**
     * 根据键名设置对应的键值
     *
     * @param preferencesId 键名
     * @param value         键值
     */
    void setParamValue(String preferencesId, String value);

    /**
     * 同步更新数据，即写入到文件中
     */
    void syncParamValue();

    /**
     * 流水号自增
     */
    void increaseTraceNumber();

    /**
     * 批次号自增
     */
    void increaseBatchNumber();

    /**
     * 插入一条交易记录
     *
     * @param transRecord 交易信息类
     */
    long insertTransRecord(TransRecord transRecord);

    /**
     * 根据流水号删除交易记录
     *
     * @param traceNum 流水号
     */
    void delTransRecord(String traceNum);

    /**
     * 删除最后一条记录，不一定是成功的交易记录
     */
    void delLastTransRecord();

    /**
     * 删除所有的交易流水
     */
    void delTotalTransRecord();

    /**
     * 更新交易记录信息
     *
     * @param transRecord
     */
    void updateTransRecord(TransRecord transRecord);

    /**
     * 根据流水号查询交易信息
     *
     * @param traceNum 流水号
     * @return 返回交易信息
     */
    TransRecord queryTransRecord(String traceNum);

    /**
     * 根据付款凭证码查询交易信息（扫码相关）
     *
     * @param traceCode 付款凭证码
     * @return
     */
    TransRecord queryScanTransRecord(String traceCode);

    /**
     * 分页查询交易列表
     *
     * @param limit  每页条数
     * @param offset 起始位置
     * @return 返回查询到的交易列表
     */
    List<TransRecord> queryListTransRecord(int limit, int offset);

    /**
     * 返回所有交易成功的记录
     *
     * @return 交易成功的记录
     */
    List<TransRecord> getSuccessfulTransRecords();

    /**
     * 返回所有为撤销交易成功的记录
     *
     * @return 交易成功的记录
     */
    List<TransRecord> getSuccessfulTransRecordsNotVoid();

    /**
     * 返回所有IC脱机拒绝的记录
     *
     * @return
     */
    List<TransRecord> getIccOfflineDeclinedTransRecords();

    /**
     * 返回所有未上送的磁条卡离线成功未撤销交易
     *
     * @return
     */
    List<TransRecord> getMagOfflineNeverUploadTransRecords();

    /**
     * 返回所有未上送的IC脱机成功未撤销交易
     *
     * @return
     */
    List<TransRecord> getIccOfflineNeverUploadTransRecords();

    /**
     * 返回所有上送被拒的脱机成功未撤销交易
     *
     * @return
     */
    List<TransRecord> getOfflineUploadRejectedTransRecords();

    /**
     * 获取所有上送被拒的脱机成功未撤销交易的笔数
     *
     * @return
     */
    long getOfflineUploadRejectedTransRecordNum();

    /**
     * 返回所有上送失败的脱机成功未撤销交易
     *
     * @return
     */
    List<TransRecord> getOfflineUploadFailedTransRecords();

    /**
     * 获取所有上送失败的脱机成功未撤销交易的笔数
     *
     * @return
     */
    long getOfflineUploadFailedTransRecordNum();

    /**
     * 获取最后一条交易记录，有可能失败的交易
     *
     * @return 返回交易信息
     */
    TransRecord getLastTransRecord();

    /**
     * 获取最后一条成功的交易记录
     *
     * @return 返回交易信息
     */
    TransRecord getLastSuccessfulTransRecord();

    /**
     * 清除交易流水记录
     */
    void clearTransRecord();

    /**
     * 清除交易冲正记录
     */
    void clearReversalRecord();

    /**
     * 保存操作员
     *
     * @param info
     */
    long saveOperator(OperatorInfo info);

    /**
     * 根据编号查询操作员信息
     *
     * @param operatorNo
     * @return
     */
    OperatorInfo getOperator(String operatorNo);

    /**
     * 获取操作员列表
     *
     * @return
     */
    List<OperatorInfo> getOperatorList();

    /**
     * 更新操作信息
     *
     * @param info
     */
    void updateOperatorInfo(OperatorInfo info);

    /**
     * 删除操作员信息
     *
     * @param OperatorNo
     */
    void deleteOperatorByOperatorNo(String OperatorNo);

    /**
     * 插入黑名单
     *
     * @param blacklist 黑名单
     * @return
     */
    long insertBlacklist(Blacklist blacklist);

    /**
     * 清除黑名单
     */
    void clearBlacklist();

    /**
     * 是否是黑名单
     *
     * @param pan 卡号
     * @return
     */
    boolean isBlacklist(String pan);

    /**
     * 是否是免密
     *
     * @param pan 卡号
     * @return
     */
    boolean isInQpsBinA(String pan);

    /**
     * 插入免密卡bin
     *
     * @param qpsBin 卡bin
     * @return
     */
    long insertQpsBinB(QpsBinB qpsBin);

    /**
     * 清除免密卡bin
     */
    void clearQpsBinB();

    /**
     * 是否是免密
     *
     * @param pan 卡号
     * @return
     */
    boolean isInQpsBinB(String pan);

    /**
     * 插入免密黑名单卡bin
     *
     * @param qpsBinC 卡bin
     * @return
     */
    long insertQpsBinC(QpsBinC qpsBinC);

    /**
     * 清除免密黑名单卡bin
     */
    void clearQpsBinC();

    /**
     * 是否是免密黑名单
     *
     * @param pan 卡号
     * @return
     */
    boolean isInQpsBinC(String pan);

    /**
     * 获取有脚本结果的交易记录
     *
     * @return
     */
    List<TransRecord> getScriptTransRecords();

    /**
     * 获取存在冲正的交易记录
     *
     * @return
     */
    List<TransRecord> getReversalTransRecords();

    /**
     * 保存电子签名数据
     *
     * @param signature
     */
    long insertSignature(Signature signature);

    /**
     * 根据凭证号获取对应的签名数据
     *
     * @param traceNum 凭证号
     * @return 返回一条签名数据
     */
    Signature getSignature(String traceNum);

    /**
     * 获取结算信息
     *
     * @return
     */
    SettleInfo getSettleInfo();

    /**
     * 保存结算信息，永远只有一条记录
     *
     * @param info
     */
    void saveSettleInfo(SettleInfo info);

    /**
     * 更新结算信息
     *
     * @param info
     */
    void updateSettleInfo(SettleInfo info);

    /**
     * 获取批上送成功的交易记录总数
     *
     * @return
     */
    long getBatchUploadSuccessfulTransRecordNum();

    /**
     * 获取最后一笔联机电子签名信息。如果当前交易有电子签名，则返回上一笔交易的电子签名信息；如果当前交易无电子签名，则返回最后一笔交易的电子签名信息
     *
     * @param traceNum 最后一笔交易的流水号
     * @return
     */
    Signature getLastOnlineButNotCurrentSignature(String traceNum);

    /**
     * 获取从未上送过的电子签名列表
     *
     * @return
     */
    List<Signature> getNeverUploadSignatures();

    /**
     * 获取上送失败的电子签名列表
     *
     * @return
     */
    List<Signature> getUploadFailedSignatures();

    /**
     * 获取从未上送过的离线交易的电子签名列表
     *
     * @return
     */
    List<Signature> getOfflineNeverUploadSignatures();

    /**
     * 更新电子签名信息
     *
     * @param signature
     */
    void updateSignature(Signature signature);

    /**
     * 清除电子签名
     */
    void clearSignature();

    /**
     * 查询电子签名记录
     *
     * @param traceNum 凭证号
     * @return
     */
    Signature querySignature(String traceNum);

    /**
     * 获取所有未上送的离线/脱机成功交易以及离线/脱机电子签名总数
     *
     * @return
     */
    long getTotalOfflineNeverUploadNum();
}
